var redis = require('../db/redis')
var mongo = require('../db/userdb')

/**
 *增加权限钩子
 *新增表单时 需要在相应团队修改所拥有的权限
 *权限存有两份 redis和mongodb各一份
 *redis在权限验证时大量查询调用 mongodb用于增删时使用
 *修改后最终效果 管理员会默认有权限 其他人员无权限 及左边无法看到
 * @Description:  jurUpdate
 * @author longfa liang
 * @date 2021/8/26
 */


class jurUpdate {

    /**
     * 获取
     * @param team_id
     * @param role_id
     * @returns {Promise<*>}
     */
    async get_jurinfo_role(team_id,role_id) {
        return await redis.hget('JURINFO_ROLE_' + team_id, role_id);
    }

    /**
     *  获取角色
     * @param team_id 团队ID
     * @param role_id 角色ID
     * @returns {Promise<*>}
     */
    async get_jurinfo_user(team_id,role_id) {
        return await redis.hget('JURINFO_USER_' + team_id, role_id);
    }

    // async jur_role_update(team_id, newtemp, module, status, type) {
    //     //修改角色
    //
    //    this.jur_role_update(team_id, role_id, newtemp, module, status, type);
    // }

    /**
     * 更具角色更新权限
     * @param team_id //团队ID
     * @param uid //用户ID
     * @param newtemp 新权限模板
     * @param module  //所属权限中的模板
     * @param status  // 0 新增 1修改
     * @param type  // 0 没权限 1有权限
     * @returns {Promise<void>}
     */
    async jur_uid_update(team_id, uid, newtemp, module, status, type) {

        //1 查询人员拥有权限


        let get_jurid = await redis.get('USER_ROLE_' +uid)

        // let get_jurid = await redis.hget('JURINFO_USER_' + team_id, uid)
        if (get_jurid) {
            let jur = await redis.hget('JURINFO_' + team_id, get_jurid) //用户单个权限
            var newjur
            if (status) {
                newjur = reloadjurupdate(JSON.parse(jur), module, newtemp, type)
            } else {
                newjur = reloadjur(JSON.parse(jur), module, newtemp)
            }
            //2 修改指定权限
            await redis.hset('JURINFO_' + team_id, jurid, JSON.stringify(newjur))
            await mongo.updateOne('jurinfor', {_id: mg.ObjectID(get_jurid)}, {$set: {module: newjur}})
        }

        //3 查询人员拥有角色
        //获取全部角色
        let role = await redis.get('USER_ROLE_' + req.headers.uid)
        role = role.split(',')
        for (let i = 0; i < role.length; i++) {
            this.jur_role_update(team_id, role[i], newtemp, module, status, type)
        }


    }

    /**
     * 更具角色更新权限
     * @param team_id //团队ID
     * @param role_id //角色ID
     * @param newtemp 新权限模板
     * @param module  //所属权限中的模板
     * @param status  // 0 新增 1修改
     * @param type  // 0 没权限 1有权限
     * @returns {Promise<void>}
     */
    async jur_role_update(team_id, role_id, newtemp, module, status, type) {

        //1、根据角色ID查询到所有权限
        //获取角色全部权限

        let jurid = await redis.hget('JURINFO_ROLE_' + team_id, role_id)
        if (jurid && jurid.length) {
            jurid = jurid.split(',')
        }

        /*修改redis中权限*/
        for (const key in jurid) {
            var newjur = []
            if (status) {
                newjur = reloadjurupdate(JSON.parse(jurid[key]), module, newtemp, type)
            } else {
                newjur = reloadjur(JSON.parse(jurid[key]), module, newtemp)
            }
            await redis.hset('JURINFO_' + team_id, jurid[key], JSON.stringify(newjur))
        }
        /*修改mongodb权限*/
        var list = await mongo.find('jurinfor', {teamid: mongo.ObjectID(team_id)})
        for (var i = 0; i < list.length; i++) {
            var jur = list[i].module
            if (jur && jur.length) {
                let newjur;
                //2、根据模板“module” 修改每个权限的内容
                if (status) {
                    console.log("更新")
                    newjur = reloadjurupdate(jurlist, module, newtemp, type)
                    console.log("更新")
                } else {
                    console.log("新增")
                    console.log(JSON.stringify(newjur))
                    newjur = reloadjur(jurlist, module, newtemp)
                }
                //3、在redis和mongodb更新新的权限
                await mongo.updateOne('jurinfor', {_id: list[i]._id}, {$set: {module: newjur}})
            }

        }

    }

    /**
     * 权限修改
     * @param team_id
     * @param newtemp
     * @param module
     * @param status
     * @param type
     * @returns {Promise<void>}
     */
    async jur_update(jur_id, newtemp, module, status, type) {
        //jur_role_update
        
    }

    /**
     * 团队所有人员新增权限
     * @param team_id 团队id
     * @param newtemp 新增的权限
     * @param module 所属模块
     * @param status 0新增 1修改
     * @param type 0取消 1新增
     *
     */
    async jurupdate(team_id, newtemp, module, status, type) {

        /*修改公司权限*/
        let teaminfo = await mongo.findOne('team', {_id: mongo.ObjectID(team_id)})
        if (!teaminfo || !teaminfo.jur) {
            return
        }
        var jurlist = teaminfo.jur

        console.log('公司也有权限', JSON.stringify(jurlist))
        let newjur = []
        if (status) {
            console.log("更新")
            newjur = reloadjurupdate(jurlist, module, newtemp, type)
            console.log("更新")
        } else {
            console.log("新增")
            console.log(JSON.stringify(newjur))
            newjur = reloadjur(jurlist, module, newtemp)
        }
        await mongo.updateOne('team', {_id: mongo.ObjectID(team_id)}, {$set: {jur: newjur}}) //修改公司权限
        /*修改redis中权限*/
        let juringfo = await redis.hgetall('JURINFO_' + team_id) //修改redis
        for (var obj in juringfo) {
            let newjur = reloadjur(JSON.parse(juringfo[obj]), module, newtemp)
            await redis.hset('JURINFO_' + team_id, obj, JSON.stringify(newjur))
        }
        /*修改mongodb权限*/
        var list = await mongo.find('jurinfor', {teamid: mongo.ObjectID(team_id)})
        for (var i = 0; i < list.length; i++) {
            var jur = list[i].module
            if (jur && jur.length) {
                let newjur;

                if (status) {
                    console.log("更新")
                    newjur = reloadjurupdate(jurlist, module, newtemp, type)
                    console.log("更新")
                } else {
                    console.log("新增")
                    console.log(JSON.stringify(newjur))
                    newjur = reloadjur(jurlist, module, newtemp)
                }
                await mongo.updateOne('jurinfor', {_id: list[i]._id}, {$set: {module: newjur}})
            }

        }

    }

}


/**
 * 权限拼接
 */
function reloadjur(jurlist, module, addjur) {

    for (var i = 0; i < jurlist.length; i++) {
        if (module == jurlist[i].module) {
            if (jurlist[i]) {
                jurlist[i].jur.push(addjur)
            }
            return jurlist
            break
        }
    }

}

/**
 * 权限拼接
 */
function reloadjur(jurlist, module, addjur) {

    for (var i = 0; i < jurlist.length; i++) {
        if (module == jurlist[i].module) {
            if (jurlist[i]) {
                jurlist[i].jur.push(addjur)
            }
            break
        }
    }
    return jurlist

}

/**
 * 权限拼接
 */
function reloadjurupdate(jurlist, module, addjur, type) {

    for (var i = 0; i < jurlist.length; i++) {
        if (module == jurlist[i].module) {
            if (jurlist[i].type == 'temp' && jurlist[i].url == addjur.id) { //模板匹配ID
                jurlist[i].status = type
            } else if (jurlist[i].server == addjur.server) { //非模板匹配server
                jurlist[i].status = type
            }
        }
    }
    return jurlist

}

module.exports = new jurUpdate()
